﻿//////////////////////////////////////////////////////////////////////////////
//
// Copyright © 1998-2024 Glodon Company Limited.
//
// Licensed under the MIT License
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the “Software”),
// to deal in the Software without restriction, including without limitation
// the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
// sell copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//
//////////////////////////////////////////////////////////////////////////////
#pragma once

#include "GmPositioningElements.h"
#include "IExternalObject.h"
#include "NdbDataSchema.h"

namespace gcmp 
{
    class IDocument;
    class ICurve2d;
    class ILine2d;
    class IArc2d;
    class ICurve3d;
    class ISurface;
    class IPlane;
    class IGraphicsElementShape;
    struct GridNewInput;
    /// \brief GBMP轴网
    ///
    /// 
    class GM_POSITIONING_ELEMENTS_EXPORT IGridNew : public IExternalObject
    {
        DECLARE_CLASS_WITHOUT_DATA_MEMBERS(gcmp, IGridNew, gcmp::IExternalObject, C1AB94B7 - D9ED - 45B2 - 855E - 3BB1D6314E6A, gmpositioningelements)
    public:
        virtual ~IGridNew() {}

    #pragma region static methods

        /// \brief 通过 GridNewInput 创建轴网
        ///
        /// \return 创建的轴网
        static IGridNew* Create(const GridNewInput& input);

        /// \brief 通过一个轴网Id来获取对应的轴网
        /// \param pDoc 文档指针
        /// \param gridId 轴网的Id
        /// \return IGridNew接口
        static IGridNew* GetGrid(const IDocument* pDoc, const ElementId& gridId);
    #pragma endregion static methods
        /// \brief 获取轴网的有界曲面
        ///
        /// 获取轴网的有界曲面
        /// ，若给定了有效的视图Id，则会返回轴网被该视图重载后的有界曲面
        /// ，否则返回全局默认的有界曲面
        /// \param modelviewId 视图Id（可选参数）
        /// \return 轴网的有界曲面
        virtual std::vector<OwnerPtr<ISurface>> GetGridSurfaces(ElementId modelviewId = ElementId::InvalidID) const = 0;

        /// \brief 获取轴网在中心水平切面上的有界交线
        ///
        /// 获取轴网在中心水平切面上的有界交线
        /// ，若给定了有效的视图Id，则会返回轴网被该视图重载后的有界交线
        /// ，否则返回全局默认的有界交线
        /// \param modelviewId 视图Id（可选参数）
        /// \return 轴网在中心水平切面上的交线
        virtual std::vector<OwnerPtr<ICurve3d>> GetHorizontalGridCurves(ElementId modelviewId = ElementId::InvalidID) const = 0;

        /// \brief 获取轴网在中心竖直切面上的有界交线
        ///
        /// 获取轴网在中心竖直切面上的有界交线
        /// ，若给定了有效的视图Id，则会返回轴网被该视图重载后的有界交线
        /// ，否则返回全局默认的有界交线
        /// \param modelviewId 视图Id（可选参数）
        /// \return 轴网在竖直水平切面上的交线
        virtual OwnerPtr<ICurve3d> GetVerticalGridCurve(ElementId modelviewId = ElementId::InvalidID) const = 0;

        /// \brief 获取轴网的竖向方向
        ///
        /// \return 轴网的竖向方向
        virtual Vector3d GetVerticalDirection() const = 0;

        /// \brief 设置轴网在中心水平切面上的有界交线
        ///
        /// 设置轴网在中心水平切面上的有界交线
        /// ，此操作会重置水平向的全局默认边界
        /// ，此操作会清空所有视图重载边界
        /// \param curves 视图Id（可选参数）
        /// \return 是否成功
        virtual bool SetHorizontalGridCurves(const std::vector<const ICurve2d*>& curves) = 0;

        /// \brief 设置轴网在竖直方向上的延伸范围
        ///
        /// 设置轴网在竖直方向上的范围
        /// ，若给定了有效的视图Id，则会修改轴网被该视图重载后的竖直方向上的范围
        /// ，否则修改全局默认的竖直方向上的范围
        /// \param extents 竖直方向上的范围
        /// \param modelviewId 视图Id（可选参数）
        /// \return 是否成功
        virtual bool SetVerticalExtents(const Intervald& extents, ElementId modelviewId = ElementId::InvalidID) = 0;

        /// \brief 获取轴网投影在平面上的ElementShape
        ///
        /// \param pPlane 投影平面
        /// \param double 显示比例
        /// \param pModelView 当前活跃视图
        /// \return 轴网投影在平面上的ElementShape
        virtual OwnerPtr<IGraphicsElementShape> CreateElementShapeBasedOnPlane(const IPlane* pPlane, double scale, const IModelView* pModelView) const = 0;

        /// \brief 获取轴网名字编号
        ///
        /// \return 轴网名字编号
        virtual std::wstring GetName() const = 0;

        /// \brief 设置轴网名字编号
        ///
        /// \param name 名字编号
        /// \return 是否成功
        virtual bool SetName(const std::wstring& name, std::wstring* errorMessage = nullptr) = 0;

        /// \brief 平面视图内，轴网起点标签是否可见
        ///
        /// \return 是否可见
        virtual bool IsStartTagVisibleInPlanView() const = 0;

        /// \brief 设置：平面视图内，轴网起点标签是否可见
        ///
        /// \param visible 是否可见
        /// \return 是否成功
        virtual bool SetStartTagVisibleInPlanView(bool visible) = 0;

        /// \brief 平面视图内，轴网终点标签是否可见
        ///
        /// \return 是否可见
        virtual bool IsEndTagVisibleInPlanView() const = 0;

        /// \brief 设置：平面视图内，轴网终点标签是否可见
        ///
        /// \param visible 是否可见
        /// \return 是否成功
        virtual bool SetEndTagVisibleInPlanView(bool visible) = 0;

        /// \brief  判断轴网在水平面上是否是直线
        ///
        /// \return 判断结果
        virtual bool IsHorizontalStraight() const = 0;

        /// \brief 判断轴网在水平面上是否是直线
        ///
        /// \return 判断结果
        virtual bool IsHorizontalArc() const = 0;
        /// \brief 自动给轴网命名
        ///
        /// \return 是否命命成功
        virtual bool AutoName() = 0;
    };

}// namespace gcmp
